home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / FParse.cpp < prev    next >
C/C++ Source or Header  |  1998-03-15  |  4KB  |  195 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "FParse.h"
  5.  
  6. short FParse::Load( char *name )
  7. {
  8.     FILE *fh;
  9.     
  10.     ClearData();
  11.     
  12.     Name = name;
  13.     
  14.     if( !(fh = fopen( name, "r" )) ) {
  15.         printf( "Fail to open file \"%s\"\n", name );
  16.         return 0;
  17.     }
  18.     
  19.     if( fseek( fh, 0, SEEK_END ) ) return 0;
  20.     
  21.     Len = ftell( fh );
  22.     
  23.     if( !Len ) {
  24.         printf( "File \"%s\" is empty\n", name );
  25.         return 0;
  26.     }
  27.     
  28.     rewind( fh );
  29.     
  30.     if( !(Data = (char*)malloc( (int)Len )) ) {
  31.         printf( "Can not allocate memory\n" );
  32.         Len = 0;
  33.         return 0;
  34.     }
  35.     
  36.     if( fread( Data, 1, Len, fh ) != Len ) {
  37.         printf( "Error reading \"%s\"\n", name );
  38.         Len = 0;
  39.         return 0;
  40.     }
  41.     
  42.     fclose( fh );
  43.     
  44.     ErrorBuf = 0;
  45.     Reset();
  46.     
  47.     return 1;
  48. }
  49.  
  50. FParse::~FParse()
  51. {
  52.     if( Data ) free( Data );
  53. }
  54.  
  55.  
  56. static const unsigned char ParseTab[ 260 ] = {
  57.  
  58.     NON, NON, NON, NON, NON, NON, NON, NON, NON, SEP,
  59.     SEP, NON, NON, NON, NON, NON, NON, NON, NON, NON,
  60.     NON, NON, NON, NON, NON, NON, NON, NON, NON, NON,
  61.     NON, NON, SEP, NON, ALN, NON, NON, NON, NON, NON,
  62.     BRC, BRC, CNT, OPR, OPR, OPR, OPR, CNT, ALN, ALN,
  63.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, OPR, OPR,
  64.     OPR, OPR, OPR, NON, NON, ALN, ALN, ALN, ALN, ALN,
  65.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  66.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  67.     ALN, BRC, NON, BRC, NON, ALN, NON, ALN, ALN, ALN,
  68.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  69.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  70.     ALN, ALN, ALN, BRC, NON, BRC, ALN, NON, NON, NON,
  71.  
  72.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  73.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  74.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  75.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  76.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  77.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  78.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  79.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  80.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  81.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  82.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  83.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN,
  84.     ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN, ALN
  85.  
  86. };
  87.  
  88.  
  89. short FParse::Next( void )
  90. {
  91.     short comment = 0, lcomment = 0;
  92.  
  93.     Prev = (tpos)*this;
  94.  
  95. again:
  96.  
  97.     if( !Tok ) Tok = Data;
  98.     
  99.     Tok += TokLen;
  100.     if( Tok >= Data + Len ) { TokLen = 0; return 1; }
  101.     TokLen = 0;
  102.  
  103.     char *p, *ps;
  104.     p = ps = Tok;
  105.     TokType = ParseTab[ *p ];
  106.  
  107.  
  108.     char prevch = 0;
  109.     /* Strings */
  110.     if( *p == '"' && !comment ) {
  111.         while( 1 ) {
  112.             p++;
  113.             if( *p == '"' && *(p-1) != '\\' ) { p++; break; }
  114.             if( !*p ) break;
  115.         }
  116.  
  117.     } else 
  118.     while( ParseTab[ *p ] == TokType && *p ) {
  119.         if( TokType == CNT && !lcomment ) {
  120.             if( prevch == '/' ) {
  121.                 if( *p == '*' ) comment++;
  122.                 if( *p == '/' ) {
  123.                     lcomment = 1;
  124.                     comment++;
  125.                 }
  126.             }
  127.             if( prevch == '*' && *p == '/' ) comment--;
  128.             prevch = *p;
  129.         }
  130.         p++;
  131.         if( ParseTab[ *p ] == BRC ) break;
  132.     }
  133.  
  134.     TokLen = (short)(p - ps);
  135.     
  136.     if( TokType == BRC && !comment) {
  137.         switch( *Tok ) {
  138.             case '{': MBracket++; break;
  139.             case '}': MBracket--; break;
  140.             case '(': CBracket++; break;
  141.             case ')': CBracket--; break;
  142.             case '[': SBracket++; break;
  143.             case ']': SBracket--; break;
  144.         }
  145.     }
  146.  
  147.     if( TokType == SEP ) {
  148.         for( p = Tok; p < Tok+TokLen; p++ ) if( *p == 10 ) {
  149.             if( lcomment ) { lcomment = 0; comment--; }
  150.             LineN++;
  151.         }
  152.         goto again;
  153.     }
  154.     if( comment ) goto again;
  155.     
  156.     return 0;
  157.     
  158. }
  159.  
  160. void tpos::reset( void )
  161. {
  162.     memset( this, 0, sizeof( tpos ) );
  163.     LineN = 1;
  164. }
  165.  
  166. tpos::tpos( void )
  167. {
  168.     reset();
  169. }
  170.  
  171. tpos &tpos::operator=( tpos &tp )
  172. {
  173.     memcpy( this, &tp, sizeof( tpos ) );
  174.     
  175.     return *this
  176. }
  177.  
  178. void FParse::StartSurvey( void )
  179. {
  180.  
  181.     Survey = (tpos)*this;
  182.     SurveyPrev = Prev;
  183.  
  184. }
  185.  
  186. void FParse::StopSurvey( void )
  187. {
  188.  
  189.     (tpos)*this = Survey;
  190.     Prev = SurveyPrev;
  191.     Survey.reset();
  192.  
  193. }
  194.  
  195.